#ifndef ADAM_DATABASE_TRANSACTION_H
#define ADAM_DATABASE_TRANSACTION_H

#include "ccstring.h"
#include "table.h"

struct transaction {
  int id;
  struct table **tables;
  int table_count;
};

/**
 * 初始化事务所需要的锁
 */
void transaction_sys_init();

/**
 * 在内存中返回事务的实例
 */
struct transaction *transaction_new();

/**
 * 在表的末尾新增一条数据
 * 暂时先不考虑类型
 * @param *T 表
 */
int tx_table_insert_row(struct table *T, struct transaction *TX,
                      struct string **col_vals, bool batch);

/**
 * 按条件更新数据
 * 暂时先不考虑类型
 * @param T 表
 * @param TX 事务
 * @param pairs 列名和列值对的数组
 * @param pair_count 数组长度
 * @param conditions 条件数组
 * @param condition_count 条件数组的长度
 * @return 更新条数，如果返回-1说明有异常
 */
int tx_table_update_row(struct table *T, struct transaction *TX,
                      struct col_name_value_pair **pairs, int pair_count,
                      struct condition **conditions, int condition_count);

/**
 * 按条件删除数据
 * 暂时先不考虑类型
 * @param T 表
 * @param TX 事务
 * @param conditions 条件数组
 * @param condition_count 条件数组的长度
 * @return 删除条数，如果返回-1说明有异常
 */
int tx_table_delete_row(struct table *T, struct transaction *TX,
                      struct condition **conditions, int condition_count);

/**
 * 查询表中的数据
 * @param *T 表
 * @param conditions 条件
 * @param condition_count 条件数组的长度
 */
struct string *tx_table_select(struct table *T, struct transaction *TX,
                               struct condition **conditions,
                               int condition_count);

/**
 * 提交事务
 * @param *TX 事务
 */
void transaction_commit(struct transaction *TX);

/**
 * 回滚事务
 * @param *TX 事务
 */
void transaction_rollback(struct transaction *TX);

/**
 * 释放事务所占用的内存空间
 * @param *TX 事务
 */
void transaction_free(struct transaction *TX);

#endif